/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __XOS_STL_PROTOCOL_PUBLIC_IMPL_PROTOCOL_PUBLIC_H__
#define __XOS_STL_PROTOCOL_PUBLIC_IMPL_PROTOCOL_PUBLIC_H__

#include "public_package.h"
#include <string>

namespace xos_protocol
{

    class public_base : public xos_protocol::public_package
    {
    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        typedef public_package BASE;
    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        public_base( xos_box::i_serial * pSerial, xos_box::i_buf * pBuf ) :
            BASE( pSerial, pBuf )
        {
        }
        ~public_base()
        {
        }
    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        std::string m_err;
    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        int req_compose( int nCookie, int nCmd )
        {
            int ret = 0;
            if( 0 == ret )
            {
                ret = BASE::req_compose( nCookie, nCmd );
            }
            return ret;
        }
        int req_dis_compose()
        {
            int ret = 0;
            return ret;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        int res_compose( int nCookie, int nCmd, int nRet )
        {
            int ret = 0;
            if( 0 == ret )
            {
                ret = BASE::res_compose( nCookie, nCmd );
            }
            if( 0 == ret )
            {
                ret = BASE::pack_int8( nRet );
            }
            if( ( 0 == ret ) && ( 0 != nRet ) )
            {
                ret = BASE::pack_str( m_err.c_str() );
            }
            return ret;
        }
        int res_dis_compose( int & nRet )
        {
            int ret = 0;
            if( 0 == ret )
            {
                uint8_t uData = 0;
                ret = BASE::un_pack_int8( &uData );
                if( 0 == ret )
                {
                    nRet = uData;
                }
            }
            if( ( 0 == ret ) && ( 0 != nRet ) )
            {
                char err[4096] = { 0 };
                ret = BASE::un_pack_str( err, sizeof( err ), 0, 0 );
                if( 0 == ret )
                {
                    m_err = err;
                }
            }
            return ret;
        }
    };

}

#endif // __XOS_STL_PROTOCOL_PUBLIC_IMPL_PROTOCOL_PUBLIC_H__
